package problema054;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class PokerHands {
	/*High Card: Highest value card.
	One Pair: Two cards of the same value.
	Two Pairs: Two different pairs.
	Three of a Kind: Three cards of the same value.
	Straight: All cards are consecutive values.
	Flush: All cards of the same suit.
	Full House: Three of a kind and a pair.
	Four of a Kind: Four cards of the same value.
	Straight Flush: All cards are consecutive values of same suit.
	Royal Flush: Ten, Jack, Queen, King, Ace, in same suit.*/
	
	static String[][] manos;
	static Character[] ordenCartas = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
	static int juego1 = 0, juego2 = 0;//del 0 al 9 indicando que juego tienen
	static int mano = 0;
	static int[] cartaPosta = new int[2];
	static Map<Integer,Integer> cartas1; 
	static Map<Integer,Integer> cartas2;
	static Map<Character,Integer> cartaValor;
	
	public static void main(String[] args){
		leer();
		cargarValores();
		mano = 0;
		cuantasGanaEl1();
	}
	
	public static void cuantasGanaEl1(){
		int res = 0;
		mano = 0;
		for(int i = 0; i < 1000; i++){
			mano = i;
			CargarMaps();
			if(laManoLaGana1()){
				System.out.println(" " + 1);
				res++;
			}else{System.out.println(" " + 2);}
		}		
		res--;
		System.out.println(res);
	}
	
	public static void cargarValores(){
		cartaValor = new HashMap<Character,Integer>();
		for(int i = 0; i < ordenCartas.length; i++){
			cartaValor.put(ordenCartas[i], i);
		}
	}
	
	public static void CargarMaps(){
		Character basura;
		Integer cuantas, valor;
		cartas1 = new HashMap<Integer,Integer>();
		cartas2 = new HashMap<Integer,Integer>();
		for(int i = 0; i < ordenCartas.length; i++){
			cartas1.put(i,0);
			cartas2.put(i,0);
		}
		for(int i = 0; i < 5; i++){
			basura = manos[mano][i].charAt(0);
			valor = cartaValor.get(basura);
			cuantas = cartas1.get(valor);
			cuantas++;
			cartas1.put(valor, cuantas);
		}
		for(int i = 5; i < 10; i++){
			basura = manos[mano][i].charAt(0);
			valor = cartaValor.get(basura);
			cuantas = cartas2.get(valor);
			cuantas++;
			cartas2.put(valor, cuantas);
		}
	}
	
	public static boolean laManoLaGana1(){
		juego1 = queTiene(1);
		juego2 = queTiene(2);
		System.out.print(mano + "  " + juego1 + " " + juego2);
		if(juego1 == juego2){
			if(juego1 == 1){
				if(cartaPosta[0] == cartaPosta[1]){
					cartaAlta(1);
					cartaAlta(2);
					return cartaPosta[0] > cartaPosta[1];
				}
			}
			return cartaPosta[0] > cartaPosta[1];
		}
		return juego1 > juego2;
	}

	public static int queTiene(int jugador){
		if(tieneEscaleraAlA(jugador) && tieneColor(jugador)) return 9;
		if(tieneEscalera(jugador) && tieneColor(jugador)) return 8;
		if(tienePoker(jugador)) return 7;
		if(tieneFull(jugador)) return 6;
		if(tieneColor(jugador)) return 5;
		if(tieneEscalera(jugador)) return 4;
		if(tienePierna(jugador)) return 3;
		if(tieneDoblePar(jugador)) return 2;
		if(tienePar(jugador)) return 1;
		cartaAlta(jugador);
		return 0;
	}
	
	public static void cartaAlta(int jugador){
		if(jugador == 1){
			for(int i = cartas1.keySet().size()-1; i > 0; i--){
				if(cartas1.get(i) > 0){
					cartaPosta[0] = i;
					break;
				}
			}
		}else{
			for(int i = cartas2.keySet().size()-1; i > 0; i--){
				if(cartas2.get(i) > 0){
					cartaPosta[1] = i;
					break;
				}
			}
		}
	}
	
	public static boolean tieneEscaleraAlA(int jugador){
		if(jugador == 1){
			for(int i = 8; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) != 1) return false;
			}
		}else{
			for(int i = 8; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) != 1) return false;
			}
		}
		return true;
	}
	
	public static boolean tieneEscalera(int jugador){
		int cant = 0;
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) != 1) continue;
				while(cant < 5 && i < cartas1.keySet().size()){
					if(cartas1.get(i) != 1) return false;
					cant++;
					i++;
				}
				cartaPosta[0] = i;
				return true;
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) != 1) continue;
				while(cant < 5 && i < cartas2.keySet().size()){
					if(cartas2.get(i) != 1)return false;
					cant++;
					i++;
				}
				cartaPosta[1] = i;
				return true;
			}
		}
		return false;
	}
	
	public static boolean tienePoker(int jugador){
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) == 4){
					cartaPosta[0] = i;
					return true;
				}
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) == 4){
					cartaPosta[1] = i;
					return true;
				}
			}
		}
		return false;		
	}
	
	public static boolean tieneFull(int jugador){
		boolean tiene2 = false, tiene3 = false;
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) == 3){
					cartaPosta[0] = i;tiene3 = true;
				}
				if(cartas1.get(i) == 2)tiene2 = true;
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) == 3){
					cartaPosta[1] = i;tiene3 = true;
				}
				if(cartas2.get(i) == 2)tiene2 = true;
			}
		}
		return tiene2 && tiene3;
	}
	
	public static boolean tieneColor(int jugador){
		if(jugador == 1){
			Character posta = manos[mano][0].charAt(1);
			Character posta1 = manos[mano][1].charAt(1);
			Character posta2 = manos[mano][2].charAt(1);
			Character posta3 = manos[mano][3].charAt(1);
			Character posta4 = manos[mano][4].charAt(1);
			return posta.equals(posta1) && posta.equals(posta2)
					&& posta.equals(posta3) && posta.equals(posta4);
		}else{
			Character posta = manos[mano][5].charAt(1);
			Character posta1 = manos[mano][6].charAt(1);
			Character posta2 = manos[mano][7].charAt(1);
			Character posta3 = manos[mano][8].charAt(1);
			Character posta4 = manos[mano][9].charAt(1);
			return posta.equals(posta1) && posta.equals(posta2)
					&& posta.equals(posta3) && posta.equals(posta4);
		}
	}
	
	public static boolean tienePierna(int jugador){
		boolean tiene3 = false;
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) == 3){
					cartaPosta[0] = i;tiene3 = true;
				}
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) == 3){
					cartaPosta[1] = i;tiene3 = true;
				}
			}
		}
		return tiene3;
	}
	
	public static boolean tieneDoblePar(int jugador){
		boolean tiene2 = false, tiene2bis = false;
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) == 2){
					cartaPosta[0] = i;
					if(tiene2){
						tiene2bis = true;
					}else{ tiene2 = true;}
				}
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) == 2){
					cartaPosta[1] = i;
					if(tiene2){
						tiene2bis = true;
					}else{ tiene2 = true;}
				}
			}
		}
		return tiene2 && tiene2bis;
	}
	
	public static boolean tienePar(int jugador){
		boolean  tiene2 = false;
		if(jugador == 1){
			for(int i = 0; i < cartas1.keySet().size(); i++){
				if(cartas1.get(i) == 2){
					cartaPosta[0] = i;tiene2 = true;
				}
			}
		}else{
			for(int i = 0; i < cartas2.keySet().size(); i++){
				if(cartas2.get(i) == 2){
					cartaPosta[1] = i;tiene2 = true;
				}
			}
		}
		return tiene2;
	}
	
	public static void leer(){
		manos = new String[1000][10];
		int fila = 0, col = 0;
		try{
			BufferedReader reader = new BufferedReader( new FileReader("pokerEj54.txt") );
			String linea, carta;
			while ((linea = reader.readLine()) != null){
				StringTokenizer st = new StringTokenizer(linea, " " );
				while (st.hasMoreTokens()){
					carta = st.nextToken();
					manos[fila][col] = carta;
					col++;
				}
				col = 0;
				fila++;
			}
			reader.close();
			}catch (Exception e){
				System.err.println("Error: " + e.getMessage());
			}
	}

}
